package elitech.vietnam.weatherfashion.ultilities;

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class MyLocation {
	private Timer timer1;
	private LocationManager lm;
	private LocationResult locationResult;
	private boolean gps_enabled = false;
	private boolean network_enabled = false;

	public boolean getLocation(Context context, LocationResult result) {
		// Use LocationResult callback class to pass location value from
		// MyLocation to user code.
		locationResult = result;
		if (lm == null)
			lm = (LocationManager) context
					.getSystemService(Context.LOCATION_SERVICE);

		// exceptions will be thrown if provider is not permitted.
		try {
			gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
		} catch (Exception ex) {
		}
		try {
			network_enabled = lm
					.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
		} catch (Exception ex) {
		}

		// don't start listeners if no provider is enabled
		if (!gps_enabled && !network_enabled)
			return false;

		if (gps_enabled)
			lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
					locationListenerGps);
		if (network_enabled)
			lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
					locationListenerNetwork);
		timer1 = new Timer();
		timer1.schedule(new GetLastLocation(), 2000);
		return true;
	}

	LocationListener locationListenerGps = new LocationListener() {
		public void onLocationChanged(Location location) {
			timer1.cancel();
			locationResult.gotLocation(location);
//			String languageCode = GoogleMapService.getCountryLanguageCode(
//					location.getLatitude(), location.getLongitude());
//			locationResult.gotlanguageCode(languageCode);
			lm.removeUpdates(this);
			lm.removeUpdates(locationListenerNetwork);
		}

		public void onProviderDisabled(String provider) {
		}

		public void onProviderEnabled(String provider) {
		}

		public void onStatusChanged(String provider, int status, Bundle extras) {
		}
	};

	LocationListener locationListenerNetwork = new LocationListener() {
		public void onLocationChanged(Location location) {
			timer1.cancel();
			locationResult.gotLocation(location);
//			String languageCode = GoogleMapService.getCountryLanguageCode(
//					location.getLatitude(), location.getLongitude());
//			locationResult.gotlanguageCode(languageCode);
			lm.removeUpdates(this);
			lm.removeUpdates(locationListenerGps);
		}

		public void onProviderDisabled(String provider) {
		}

		public void onProviderEnabled(String provider) {
		}

		public void onStatusChanged(String provider, int status, Bundle extras) {
		}
	};

	class GetLastLocation extends TimerTask {
		@Override
		public void run() {
			lm.removeUpdates(locationListenerGps);
			lm.removeUpdates(locationListenerNetwork);

			Location net_loc = null, gps_loc = null;
			if (gps_enabled)
				gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
			if (network_enabled)
				net_loc = lm
						.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

			// if there are both values use the latest one
			String languageCode = "";
			if (gps_loc != null && net_loc != null) {
				if (gps_loc.getTime() > net_loc.getTime()) {
					locationResult.gotLocation(gps_loc);

//					languageCode = GoogleMapService.getCountryLanguageCode(
//							gps_loc.getLatitude(), gps_loc.getLongitude());
//					locationResult.gotlanguageCode(languageCode);
				} else {
					locationResult.gotLocation(net_loc);

//					languageCode = GoogleMapService.getCountryLanguageCode(
//							net_loc.getLatitude(), net_loc.getLongitude());
//					locationResult.gotlanguageCode(languageCode);
				}
				return;
			}

			if (gps_loc != null) {
				locationResult.gotLocation(gps_loc);

//				languageCode = GoogleMapService.getCountryLanguageCode(
//						gps_loc.getLatitude(), gps_loc.getLongitude());
//				locationResult.gotlanguageCode(languageCode);
				return;
			}
			if (net_loc != null) {
				locationResult.gotLocation(net_loc);

//				languageCode = GoogleMapService.getCountryLanguageCode(
//						net_loc.getLatitude(), net_loc.getLongitude());
//				locationResult.gotlanguageCode(languageCode);
				return;
			}

			locationResult.gotLocation(null);
		//	locationResult.gotlanguageCode(null);
		}
	}

	public static abstract class LocationResult {
		public abstract void gotLocation(Location location);

	//	public abstract void gotlanguageCode(String code);
	}
}